package com.tedu.day02.oop;

/**
 * 抽象类和抽象方法 关键字：abstract
 * 类：提供行为的概念,没有具体的行为
 *
 * 与面向对象多态---绝对的关系
 * 使用多态创建抽象类对象，抽象类本身无法直接创建对象
 *
 * 复炸项目时，在不同类下实现不同功能，首先抽象类【Android常用】
 *
 * 定义抽象类与抽象方法:
 * 类：修饰符 abstract class 类名{}
 * 抽象方法：修饰符 abstract 返回值 方法(参数);
 *
 * 抽象类的实例化【创建对象】
 * 1.创建【N】子类，继承父类，子类一定实现了抽象【父】类的所有抽象方法
 * 2.使用面向对象：多态【向上造型】  抽象类 引用=new 【实现】子类();
 * 注意：抽象类一定发生重写，子类继承父类，也可以叫实现类
 */
abstract class Animals{
    //抽象类
    //抽象方法:没有具体的代码块---一定被继承--一定多态【造型】
    public abstract void say();
    //1.抽象类不可以定义final修饰的抽象方法
    //public abstract void sleep();
    //2.abstract不可以修饰变量
    //abstract int i;
    //3.可以定义静态变量
    static int a;
    //4.不可以定义静态的抽象变量
    //static abstract int j=7;
    //5.不可以定义一个静态的抽象方法-无实现
    //public static abstract void eat();
    //6.定义静态方法-无实现:空代码块
    public static void eat(){};
    //总结：抽象方法/静态方法 二选一 方法定义： 修饰符 static|abstract 返回值 方法名
    //7.抽象类里可以定义内部类，可以定义静态内部类
    static class sos{}
    //8.抽象类有构造器
    public Animals() {
    }

    //9.抽象类当中存在普通实现方法
    public void sleep(){}

}
    //10.抽象类可以继承抽象类吗 实现：两个抽象类-形容一个实现
abstract class Think extends Animals{
    public abstract void sleep();
    }
    //如果想实现两个抽象方法-继承子抽象类

//实现类,实现抽象【父】类的方法--多个实现类--继承--抽象
class person extends Animals{//报错原因：完成重写
    @Override
    public void say() {
        System.out.println("人--说话-");
    }
}
public class 抽象类 {
    public static void main(String[] args) {
        //抽象类无法实例化--必须由子类实现
        //Animals a=new Animals();
       Animals a=new person();
       a.say(); //向上造型--重写父类的方法【覆盖】
    }
}
